package modele;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;

import modele.Batiment.Batiment;
import modele.Batiment.Canon;




public class TestMap {
	public TestMap()
	{
		int retour;
		
		retour = testVoisines2()*testVoisines2()*testVoisines3()*testVoisines4()*testVoisines5();
		if(retour != 1)
		{
			System.out.println("------Les tests de l'algorithme de recherche des voisines ont plante------");
			assert false;
			return;
		}
		
		retour = testRecherche1()*testRecherche2()*testRecherche3()*testRecherche4();
		if(retour != 1)
		{
			System.out.println("------Les tests de l'algorithme de recherche de chemin ont plante------");
			assert false;
			return;
		}
		
		
		//System.out.println("Les tests de l'algorithme de recherche de chemin ont ete passe avec succes");
			
	}
	
	
	/**
	 * teste les voisines d'une configuration de case : coin en bas à gauche
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testVoisines1()
	{
		Map map = new Map(4, 5);
		ArrayList<Case> l = map.voisines(new Case(0,0), new HashSet<Case>());
		if(l.size() != 2)
			return 0;
		if(! l.get(0).equals(new Case(1,0)))
			return 0;
		if(! l.get(1).equals(new Case(0,1)))
			return 0;
		
		return 1;
	}
	
	/**
	 * teste les voisines d'une configuration de case : coin en haut à droite
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testVoisines2()
	{
		Map map = new Map(4, 5);
		ArrayList<Case> l = map.voisines(new Case(3,4), new HashSet<Case>());
		if(l.size() != 2)
			return 0;
		if(! l.get(0).equals(new Case(2,4)))
			return 0;
		if(! l.get(1).equals(new Case(3,3)))
			return 0;
		
		return 1;
	}
	
	
	/**
	 * teste les voisines d'une configuration de case : coin en bas à droite
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testVoisines3()
	{
		Map map = new Map(4, 5);
		ArrayList<Case> l = map.voisines(new Case(0,4), new HashSet<Case>());
		if(l.size() != 2)
			return 0;
		if(! l.get(0).equals(new Case(1,4)))
			return 0;
		if(! l.get(1).equals(new Case(0,3)))
			return 0;
		
		return 1;
	}
	
	
	/**
	 * teste les voisines d'une configuration de case : coin en haut à gauche
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testVoisines4()
	{
		Map map = new Map(4, 5);
		ArrayList<Case> l = map.voisines(new Case(3,0), new HashSet<Case>());
		if(l.size() != 2)
			return 0;
		if(! l.get(0).equals(new Case(2,0)))
			return 0;
		if(! l.get(1).equals(new Case(3,1)))
			return 0;
		
		return 1;
	}
	
	
	/**
	 * teste les voisines d'une configuration de case : au centre
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testVoisines5()
	{
		Map map = new Map(4, 5);
		ArrayList<Case> l = map.voisines(new Case(1,1), new HashSet<Case>());
		if(l.size() != 4)
			return 0;
		if(! l.get(0).equals(new Case(0,1)))
			return 0;
		if(! l.get(1).equals(new Case(2,1)))
			return 0;
		if(! l.get(2).equals(new Case(1,0)))
			return 0;
		if(! l.get(3).equals(new Case(1,2)))
			return 0;
		
		return 1;
	}
	
	
	/**
	 * teste une configuration pour l'algo de recherche de chemin
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testRecherche1()
	{
		Map map = new Map(4, 5);
		
		Position positionDepart = new Position(0,0);
		Position positionArrivee = new Position(4,2);
		
		Batiment batiment1 = new Canon(new Position(1,1));
		Batiment batiment2 = new Canon(new Position(2,1));
		Batiment batiment3 = new Canon(new Position(3,1));
		Batiment batiment4 = new Canon(new Position(4,1));
		
		map.marquerCreationBatiment(batiment1);
		map.marquerCreationBatiment(batiment2);
		map.marquerCreationBatiment(batiment3);
		map.marquerCreationBatiment(batiment4);
		
		
		
		LinkedList<Direction> liste = map.chercherChemin(positionDepart, positionArrivee, 20);
		
		
		
		if(liste.size() != 6)
			return 0;
		if(liste.get(0) != Direction.DROITE)
			return 0;
		if(liste.get(1) != Direction.DROITE)
			return -1;
		if(liste.get(2) != Direction.HAUT)
			return -2;
		if(liste.get(3) != Direction.HAUT)
			return 0;
		if(liste.get(4) != Direction.HAUT)
			return 0;
		if(liste.get(5) != Direction.HAUT)
			return 0;
		
		return 1;
	}
	
	/**
	 * teste une configuration pour l'algo de recherche de chemin
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testRecherche2()
	{
		Map map = new Map(4, 5);
		
		Position positionDepart = new Position(0,0);
		Position positionArrivee = new Position(4,2);
		
		
		Batiment batiment1 = new Canon(new Position(1,1));
		Batiment batiment2 = new Canon(new Position(2,1));
		Batiment batiment3 = new Canon(new Position(3,1));
		Batiment batiment4 = new Canon(new Position(4,1));
		Batiment batiment5 = new Canon(new Position(3,2));
		
		map.marquerCreationBatiment(batiment1);
		map.marquerCreationBatiment(batiment2);
		map.marquerCreationBatiment(batiment3);
		map.marquerCreationBatiment(batiment4);
		map.marquerCreationBatiment(batiment5);
		LinkedList<Direction> liste = map.chercherChemin(positionDepart, positionArrivee, 20);
		
		
		
		if(liste.size() != 8)
			return 0;
		if(liste.get(0) != Direction.DROITE)
			return 0;
		if(liste.get(1) != Direction.DROITE)
			return 0;
		if(liste.get(2) != Direction.HAUT)
			return 0;
		if(liste.get(3) != Direction.HAUT)
			return 0;
		if(liste.get(4) != Direction.DROITE)
			return 0;
		if(liste.get(5) != Direction.HAUT)
			return 0;
		if(liste.get(6) != Direction.HAUT)
			return 0;
		if(liste.get(7) != Direction.GAUCHE)
			return 0;
		
		return 1;
	}
	
	
	/**
	 * teste une configuration pour l'algo de recherche de chemin
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testRecherche3()
	{
		Map map = new Map(4, 5);
		
		Position positionDepart = new Position(0,0);
		Position positionArrivee = new Position(2,0);
		
		
		Batiment batiment1 = new Canon(new Position(1,0));
		Batiment batiment2 = new Canon(new Position(1,1));
		Batiment batiment3 = new Canon(new Position(2,1));
		Batiment batiment4 = new Canon(new Position(3,1));
		
		
		map.marquerCreationBatiment(batiment1);
		map.marquerCreationBatiment(batiment2);
		map.marquerCreationBatiment(batiment3);
		map.marquerCreationBatiment(batiment4);
		LinkedList<Direction> liste = map.chercherChemin(positionDepart, positionArrivee, 20);
		
		
		
		if(liste.size() != 10)
			return 0;
		if(liste.get(0) != Direction.DROITE)
			return 0;
		if(liste.get(1) != Direction.DROITE)
			return -1;
		if(liste.get(2) != Direction.HAUT)
			return -2;
		if(liste.get(3) != Direction.HAUT)
			return 0;
		if(liste.get(4) != Direction.HAUT)
			return 0;
		if(liste.get(5) != Direction.HAUT)
			return 0;
		if(liste.get(6) != Direction.GAUCHE)
			return 0;
		if(liste.get(7) != Direction.GAUCHE)
			return 0;
		if(liste.get(8) != Direction.BAS)
			return 0;
		if(liste.get(9) != Direction.BAS)
			return 0;
		
		return 1;
	}
	
	
	/**
	 * teste une configuration pour l'algo de recherche de chemin
	 * @return 1 en cas de succès, 0 sinon
	 */
	public int testRecherche4()
	{
		Map map = new Map(4, 5);
		
		Position positionDepart = new Position(4,3);
		Position positionArrivee = new Position(0,0);
		
		
		Batiment batiment1 = new Canon(new Position(3,3));
		Batiment batiment2 = new Canon(new Position(3,2));
		Batiment batiment3 = new Canon(new Position(3,1));
		Batiment batiment4 = new Canon(new Position(1,0));
		Batiment batiment5 = new Canon(new Position(1,1));
		Batiment batiment6 = new Canon(new Position(1,2));
		
		map.marquerCreationBatiment(batiment1);
		map.marquerCreationBatiment(batiment2);
		map.marquerCreationBatiment(batiment3);
		map.marquerCreationBatiment(batiment4);
		map.marquerCreationBatiment(batiment5);
		map.marquerCreationBatiment(batiment6);
		LinkedList<Direction> liste = map.chercherChemin(positionDepart, positionArrivee, 20);
		
		
		if(liste.size() != 13)
			return 0;
		if(liste.get(0) != Direction.GAUCHE)
			return 0;
		if(liste.get(1) != Direction.GAUCHE)
			return -1;
		if(liste.get(2) != Direction.GAUCHE)
			return -2;
		if(liste.get(3) != Direction.BAS)
			return 0;
		if(liste.get(4) != Direction.BAS)
			return 0;
		if(liste.get(5) != Direction.DROITE)
			return 0;
		if(liste.get(6) != Direction.DROITE)
			return 0;
		if(liste.get(7) != Direction.DROITE)
			return 0;
		if(liste.get(8) != Direction.BAS)
			return 0;
		if(liste.get(9) != Direction.BAS)
			return 0;
		if(liste.get(10) != Direction.GAUCHE)
			return 0;
		if(liste.get(11) != Direction.GAUCHE)
			return 0;
		if(liste.get(12) != Direction.GAUCHE)
			return 0;
		
		return 1;
	}
}
